import type { TableColumnCtx } from 'element-plus/es/components/table/src/table-column/defaults'
import type { VNode, Ref } from 'vue'

export interface ColumnItem<T = any> extends Partial<TableColumnCtx<T>> {
  render?: (scope: any) => any //自定义单元格渲染（tsx语法）
  headerRender?: (scope: HeaderRenderScope<T>) => VNode //自定义表头渲染（tsx语法）
  operation?: Operation[]
}

export interface Operation {
  label: string //操作名称
  show?: (scope: any) => boolean //是否显示
  click: (scope: any) => void //点击事件
}

export interface SearchItem {
  key: string //字段名
  label?: string //字段描述
  props?: any //组件配置
  el?: 'input' | 'select' | 'date-picker' //组件类型
  enum?: any //选项集合（选择器使用）
  enumKey?: string //选项集合enumMap键名 针对需要重复接口获取选项 只请求一次
  defaultValue?: string | number | boolean | any[] | Ref<any> // 搜索项默认值
  slots?: SlotItem[] //自定义插槽集合
  events?: { [key: string]: (...args: any) => any } //绑定事件集合
  component?: any //引入组件
  render?: () => any //自定义渲染
  fieldNames?: FieldNamesProps // 指定 label && value && children 的 key 值
  // [key: string]: any;
}

/** 插槽项 */
interface SlotItem {
  name: string //插槽名称
  render: () => any //插槽渲染
}

export type FieldNamesProps = {
  label: string
  value: string
  children?: string
}

export interface TableState {
  /** 表格数据 */
  tableData: any[]
  /** 分页数据 */
  pageParam: PageParam
  /** 搜索表单参数（查询、重置操作时携带的参数） */
  searchParam: { [key: string]: any }
  /** 搜索表单初始化参数 */
  searchInitParam: { [key: string]: any }
  /** 实际查询参数（切页、排序操作时携带的参数） */
  actualParam: { [key: string]: any }
  loading: boolean
  searchDrawerVisible: boolean
}

export interface PageParam {
  pageNo: number
  pageSize: number
  total: number
}

export type RenderScope<T> = {
  row: T
  $index: number
  column: TableColumnCtx<T>
  [key: string]: any
}

export type HeaderRenderScope<T> = {
  $index: number
  column: TableColumnCtx<T>
  [key: string]: any
}
